热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

视频录像|品类_IP摄像机移动应用SDK开发入门教程(安卓版)

篇首语:本文由编程笔记#小编为大家整理,主要介绍了IP摄像机移动应用SDK开发入门教程(安卓版)相关的知识,希望对你有一定的参考价值。涂鸦智能安卓版摄像机ÿ

篇首语:本文由编程笔记#小编为大家整理,主要介绍了IP 摄像机移动应用 SDK 开发入门教程(安卓版)相关的知识,希望对你有一定的参考价值。


涂鸦智能安卓版摄像机(IP Camera,简称 IPC)SDK 是基于智能生活 App SDK 开发而成。

通过移动应用控制物理网设备是常见的使用场景,但由于设备的品类丰富,增大了应用开发难度。因此 智能生活 App SDK 提供了常见的垂直品类 SDK,例如 IPC SDK,将网络摄像机设备特有的功能抽离,提供了与其通讯的接口封装,加速应用开发过程。 

大家可以通过本教程,在一小时内快速开发一款自己的 IoT App,并实现如下功能:


  •  通过 App 连接一个智能摄像头。
  •  预览摄像机实时采集的影像。
  •  播放摄像机存储卡中录制的视频。
  •  手机端录制摄像机采集的影像。

大家可以 前往App工作台 下载 Sample 查看本教程中的示例代码。本次教程按功能模块进行分类,大家可以快速找到对应的代码参考学习。


效果展示

学习完本教程,结合一定的面板开发可以创建一个类似以下安卓 App 的 Demo。


准备工作

在开始本教程前,请先确保完成一下工作 :


  1. 在涂鸦 IoT 平台,注册账号并创建 App 应用,拿到 SDK 的 AppKey,AppSecret。

    由于 IPC SDK 依赖于 智能生活 App SDK,需要先实现如创建账号、添加家庭的操作后才能借助 IPC SDK 实现摄像机相关功能。具体操作流程可参考我上一篇文章《智能生活 App SDK 开发入门教程》。

  2. 准备一个涂鸦赋能的智能摄像机产品,本教程以摄像头为例。
  3. 使用 android Studio 将涂鸦安卓智能生活 App SDK 集成到项目中 。 具体教程可参考我之前文章《 IPC SDK 架构及快速集成配置》。

设备配网

由涂鸦赋能的智能摄像机支持智能生活 App SDK 中的所有配网方式,例如 Wi-Fi 热点配网蓝牙配网等。

此外,涂鸦为 IPC 设备提供了独有的扫描二维码配网功能,但如果 IP 摄像机设备无法扫码,可以优先尝试 Wi-Fi 快连方式。本篇教程文档主要讲解扫描二维码配网。


获取 Token

和 Wi-Fi 快连和 Wi-Fi 热点模式类似,开始配网之前,SDK 需要在手机已联网的状态下从涂鸦获取配网 Token,然后才可以开始配网。

配网 Token 的有效期为 10 分钟,且配置成功后就会失效,再次配网需要重新获取。获取 Token 需要上传当前的 homeId,因此我们需要确保用户处于登录状态,并至少创建了一个家庭。

TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId,
new ITuyaActivatorGetToken()
@Override
public void onSuccess(String token)

@Override
public void onFailure(String s, String s1)

);

生成配网二维码

获取到配网 Token 后,我们还需要当前 Wi-Fi 的名称(SSID)和密码,通过初始化配网参数的回调 onQRCodeSuccess,拿到二维码的 URL 字符串生成一个二维码图片。

相关依赖为 zxing(implementation ‘com.google.zxing:core:3.2.1’)。

// Get Network Configuration Token
TuyaHomeSdk.getActivatorInstance().getActivatorToken(homeId,
new ITuyaActivatorGetToken()
@Override
public void onSuccess(String token)
//Create and show qrCode
TuyaCameraActivatorBuilder builder = new TuyaCameraActivatorBuilder()
.setToken(token)
.setPassword(wifiPwd)
.setTimeOut(100)
.setContext(QrCodeConfigActivity.this)
.setSsid(wifiSSId)
.setListener(new ITuyaSmartCameraActivatorListener()
@Override
public void onQRCodeSuccess(String qrcodeUrl)
final Bitmap bitmap;
try
bitmap = QRCodeUtil.createQRCode(qrcodeUrl, 300);
QrCodeConfigActivity.this.runOnUiThread(new Runnable()
@Override
public void run()
mIvQr.setImageBitmap(bitmap);
mLlInputWifi.setVisibility(View.GONE);
mIvQr.setVisibility(View.VISIBLE);

);
catch (WriterException e)
e.printStackTrace();


@Override
public void onError(String errorCode, String errorMsg)

@Override
public void onActiveSuccess(DeviceBean devResp)
Toast.makeText(QrCodeConfigActivity.this,"config success!",Toast.LENGTH_LONG).show();

);

其中生成二维码图片示例代码如下:

public static Bitmap createQRCode(String url, int widthAndHeight)
throws WriterException
Hashtable hints = new Hashtable();
hints.put(EncodeHintType.CHARACTER_SET, "utf-8");
hints.put(EncodeHintType.MARGIN,0);
BitMatrix matrix = new MultiFormatWriter().encode(url,
BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight, hints);
int width = matrix.getWidth();
int height = matrix.getHeight();
int[] pixels = new int[width * height];
for (int y = 0; y for (int x = 0; x if (matrix.get(x, y))
pixels[y * width + x] = BLACK; //0xff000000



Bitmap bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
return bitmap;


开始配网

开始配网前,请确保设备处于待配网状态。操作方法可参考设备的使用说明书。

在成功生成二维码后,引导用户将二维码对准摄像头,捕捉到二维码信息后会发出提示音。开始配网操作后,SDK 会持续广播配网信息,直到配网成功或是超时才停止。

调用 配网接口。目前已经创建好 TuyaCameraActivatorBuilder 对象 builder,只需进行下面几行代码调用即可。

mTuyaActivator = TuyaHomeSdk.getActivatorInstance().newCameraDevActivator(builder);
mTuyaActivator.createQRCode();
mTuyaActivator.start();

监听配网结果

在上面构建配网参数时候,我们通过 TuyaCameraActivatorBuilder 对象 builder 设置监听,通过 ITuyaSmartCameraActivatorListener 回调监听配网结果。

public interface ITuyaSmartCameraActivatorListener
void onQRCodeSuccess(String qrcodeUrl);
void onError(String errorCode, String errorMsg);
void onActiveSuccess(DeviceBean devResp);

停止配网 

如果需要中途取消配网,如离开配网页面,或配网完成,请调【停止配网】接口。

mTuyaActivator.stop();

视频实时预览(视频直播)

IPC SDK 提供智能摄像机的实时视频播放、设备存储卡录像播放、对当前正在播放的视频截图、录制视频、与摄像机实时通话等基础能力。


第一步:初始化

我们需要首先初始化一个 ITuyaSmartCameraP2P 对象。该对象用于读取智能摄像机设备的相关属性和方法。

TuyaCameraView 是 IPC SDK 提供的视频渲染视图,通过它可以快速的搭建渲染出视频预览画面。

// 1. 创建 ITuyaSmartCameraP2P
ITuyaSmartCameraP2P mCameraP2P = null;
ITuyaIPCCore cameraInstance = TuyaIPCSdk.getCameraInstance();
if (cameraInstance != null)
mCameraP2P = cameraInstance.createCameraP2P(devId));
TuyaCameraView mVideoView = findViewById(R.id.camera_video_view);
// 2. 为渲染视图容器设置回调
mVideoView.setViewCallback(new AbsVideoViewCallback()
@Override
public void onCreated(Object view)
super.onCreated(view);
//4. 渲染视图构造完成时,为 ITuyaSmartCameraP2P 绑定渲染视图
if (null != mCameraP2P)
mCameraP2P.generateCameraView(view);


);
// 3. 构造渲染视图
mVideoView.createVideoView(p2pType);
// 4. 注册 P2P 监听
if (null != mCameraP2P)
mCameraP2P.registerP2PCameraListener(new AbsP2pCameraListener()
@Override
public void onSessionStatusChanged(Object camera, int sessionId, int sessionStatus)
super.onSessionStatusChanged(o, i, i1);

);


第二步:连接 P2P 通道

一系列初始化动作完成后,需要先连接 P2P 通道。P2P 的连接状态需要我们自行维护。

开始连接 P2P 通道,参数 mode 可以指定优先选择的连接模式,是通过局域网还是公网来连接。如果指定局域网连接优先,但是 App 和设备没有在同一个局域网内建立 TCP 连接,或者设备不支持局域网连接优先,SDK 会自动使用公网连接模式。


  • 建立指定通道

    void connect(String devId, int mode, OperationDelegateCallBack callBack);

  • 断开通道

    在关闭通道或离开当前页面时,我们需要调用接口关闭通道。

    void disconnect(String devId, OperationDelegateCallBack callBack);

  • 状态监听

    若需要在过程中监听通道的连接和断开,可通过 OperationDelegateCallBack 来实现监听。

    mCameraP2P.connect(devId, new OperationDelegateCallBack()
    @Override
    public void onSuccess(int sessionId, int requestId, String data)
    //连接成功

    @Override
    public void onFailure(int sessionId, int requestId, int errCode)
    //连接失败

    );


第三步:预览实时视频

在建立 P2P 通道后,用户就可以预览在线视频了。


  • 开始预览

    以下代码中,clarity 是清晰度模式,2 代表标清、4 代表高清。

    void startPreview(int clarity, OperationDelegateCallBack callBack);

  • 结束预览

    int stopPreview(OperationDelegateCallBack callBack);

  • 状态监听

    实现如下代码可以监听视频开始预览的状态变化,stopPreview 同理。

    mCameraP2P.startPreview(new OperationDelegateCallBack()
    @Override
    public void onSuccess(int sessionId, int requestId, String data)
    //开始播放实时视频成功

    @Override
    public void onFailure(int sessionId, int requestId, int errCode)
    //开始播放实时视频失败

    );


第四步:注销进程

不再使用摄像机视频功能的时候,请务必注销 P2P 监听器和删除 P2P 对象。

@Override
public void onDestroy()
if (null != mCameraP2P)
mCameraP2P.removeOnP2PCameraListener();
mCameraP2P.destroyP2P();


视频录制与实时对讲

在预览实时视频的同时,还可以对录制在线视频或通过摄像机实时对讲。


  • 开始录制或对讲

    int startRecordLocalMp4(String folderPath, Context context, OperationDelegateCallBack callBack);
    void startAudioTalk(OperationDelegateCallBack callBack);

  • 结束录制/对讲

    int stopRecordLocalMp4(OperationDelegateCallBack callBack);
    void stopAudioTalk(OperationDelegateCallBack callBack);

  • 监听状态

    我们可以通过监听回调事件 OperationDelegateCallBack 来监听录制和实时对讲的状态。

    public interface OperationDelegateCallBack
    void onSuccess(int sessionId, int requestId, String data);
    void onFailure(int sessionId, int requestId, String data);


回放历史视频

设备在存储卡中保存视频录像后,可以通过 IPC SDK 在 App 端播放视频录像。

和视频预览一样,在开始回放前,需要先连接上 P2P 通道。

IPC SDK 支持以天为单位查看和播放视频录像,并且提供查询某年某月中,哪几天保存有视频录像,以便于用户查看,查询结果通过 OperationDelegateCallBack 监听回调返回。



查询视频列表

创建 ITuyaSmartCameraP2P 对象,连接上 P2P 通道。P2P 通道连接成功后,可以获取到设备端存储卡中录制的视频片段时间信息。

第一步:查询特定月份保存过视频的日期

int year = Integer.parseInt(substring[0]);
int mouth = Integer.parseInt(substring[1]);
queryDay = Integer.parseInt(substring[2]);
mCameraP2P.queryRecordDaysByMonth(year, mouth, new OperationDelegateCallBack()
@Override
public void onSuccess(int sessionId, int requestId, String data)
//data 是获取到的月份数据
MonthDays monthDays = JSONObject.parseObject(data, MonthDays.class);
mBackDataMonthCache.put(mCameraP2P.getMonthKey(), monthDays.getDataDays());
mHandler.sendMessage(MessageUtil.getMessage(MSG_DATA_DATE, ARG1_OPERATE_SUCCESS, data));

@Override
public void onFailure(int sessionId, int requestId, int errCode)
mHandler.sendMessage(MessageUtil.getMessage(MSG_DATA_DATE, ARG1_OPERATE_FAIL));

);

第二步:获取特定日期的视频列表

我们可以根据上一步返回的日期查询当天的视频信息列表。

int year = Integer.parseInt(substring[0]);
int mouth = Integer.parseInt(substring[1]);
int day = Integer.parseInt(substring[2]);
mCameraP2P.queryRecordTimeSliceByDay(year, mouth, day, new OperationDelegateCallBack()
@Override
public void onSuccess(int sessionId, int requestId, String data)
//data 是获取到指定日期的视频片段数据
parsePlaybackData(data);

@Override
public void onFailure(int sessionId, int requestId, int errCode)
mHandler.sendEmptyMessage(MSG_DATA_DATE_BY_DAY_FAIL);

);

private void parsePlaybackData(Object obj)
RecordInfoBean recordInfoBean = JSONObject.parseObject(obj.toString(), RecordInfoBean.class);
if (recordInfoBean.getCount() != 0)
List timePieceBeanList = recordInfoBean.getItems();
if (timePieceBeanList != null && timePieceBeanList.size() != 0)
mBackDataDayCache.put(mCameraP2P.getDayKey(), timePieceBeanList);

mHandler.sendMessage(MessageUtil.getMessage(MSG_DATA_DATE_BY_DAY_SUCC, ARG1_OPERATE_SUCCESS));
else
mHandler.sendMessage(MessageUtil.getMessage(MSG_DATA_DATE_BY_DAY_FAIL, ARG1_OPERATE_FAIL));


以上代码涉及了以下 2 个实体对象类:


  • RecordInfoBean 数据模型:


    参数说明
    count片段个数
    List视频片段集合
  • TimePieceBean 数据模型:


    参数说明
    startTime视频片段开始时间
    endTime视频片段结束时间
    playTime视频片段播放时间

完成以上步骤,我们就可以获取到有回放的视频片段。


播放视频

成功查询到某天中的视频录像片段后,就可以开始播放录像视频了。


  • 开始播放

    mCameraP2P.startPlayBack(timePieceBean.getStartTime(),
    timePieceBean.getEndTime(),
    timePieceBean.getStartTime(), new OperationDelegateCallBack()
    @Override
    public void onSuccess(int sessionId, int requestId, String data)
    isPlayback = true;

    @Override
    public void onFailure(int sessionId, int requestId, int errCode)
    isPlayback = false;

    , new OperationDelegateCallBack()
    @Override
    public void onSuccess(int sessionId, int requestId, String data)
    isPlayback = false;

    @Override
    public void onFailure(int sessionId, int requestId, int errCode)
    isPlayback = false;

    );

    该方法的三个参数均为时间戳:


    • PlayTime 为播放的初始帧时间,可以与 startTime 设置为同一值。
    • StartTime 为播放的开始时间,为 TimePieceBean 数据模型中 startTime 相对应的值。
    • EndTime 为播放的结束时间,为 TimePieceBean ​​​​​​​数据模型中 endTime 相对应的值。
  • 暂停回放

    void pausePlayBack(OperationDelegateCallBack callBack);

  • 继续回放

    void resumePlayBack(OperationDelegateCallBack callBack);

  • 停止回放

    void stopPlayBack(OperationDelegateCallBack callBack);

  • 监听回调(OperationDelegateCallBack)

    public interface OperationDelegateCallBack
    void onSuccess(int sessionId, int requestId, String data);
    void onFailure(int sessionId, int requestId, String data);


相关概念

涂鸦智能摄像机的视频录像分为 连续录像 和 事件录像


  • 连续录像:视频录像会是 10 分钟一个片段,且所有视频片段是连续的,但是如果中间有停止过视频录像,那么连续录像模式下的视频片段间也可能会有间隔。

    如果某天的视频录像片段是连续的,那么播放录像时,会自动播放下一段。也就是说,即使调用开始播放接口,传入的是当天第一个视频片段的时间点,视频也会一直播放到当天最后一个视频片段的最后一帧视频,才会回调视频播放结束的代理方法。

  • 事件录像:每个录像片段长度不等,且片段间的间隔时间也长短不一。

    如果某天的视频录像片段是不连续的,即视频录像片段 A 结束后隔了一段时间才有视频录像片段 B,在播放到断开的地方(即播放到视频片段 A 的最后一帧),视频流会自动停止。


下一步

IPC SDK 还提供了更多功能,大家可以登录涂鸦 IoT 开发平台​​​​​​​,根据 Sample 工程和 IPC SDK 文档了解如何构建 App。


推荐阅读
  • 基于移动平台的会展导游系统APP设计与实现的技术介绍与需求分析
    本文介绍了基于移动平台的会展导游系统APP的设计与实现过程。首先,对会展经济和移动互联网的概念进行了简要介绍,并阐述了将会展引入移动互联网的意义。接着,对基础技术进行了介绍,包括百度云开发环境、安卓系统和近场通讯技术。然后,进行了用户需求分析和系统需求分析,并提出了系统界面运行流畅和第三方授权等需求。最后,对系统的概要设计进行了详细阐述,包括系统前端设计和交互与原型设计。本文对基于移动平台的会展导游系统APP的设计与实现提供了技术支持和需求分析。 ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • Android实战——jsoup实现网络爬虫,糗事百科项目的起步
    本文介绍了Android实战中使用jsoup实现网络爬虫的方法,以糗事百科项目为例。对于初学者来说,数据源的缺乏是做项目的最大烦恼之一。本文讲述了如何使用网络爬虫获取数据,并以糗事百科作为练手项目。同时,提到了使用jsoup需要结合前端基础知识,以及如果学过JS的话可以更轻松地使用该框架。 ... [详细]
  • 【爬虫】关于企业信用信息公示系统加速乐最新反爬虫机制
    ( ̄▽ ̄)~又得半夜修仙了,作为一个爬虫小白,花了3天时间写好的程序,才跑了一个月目标网站就更新了,是有点悲催,还是要只有一天的时间重构。升级后网站的层次结构并没有太多变化,表面上 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • Android Studio Bumblebee | 2021.1.1(大黄蜂版本使用介绍)
    本文介绍了Android Studio Bumblebee | 2021.1.1(大黄蜂版本)的使用方法和相关知识,包括Gradle的介绍、设备管理器的配置、无线调试、新版本问题等内容。同时还提供了更新版本的下载地址和启动页面截图。 ... [详细]
  • 图像因存在错误而无法显示 ... [详细]
  • 本文介绍了互联网思维中的三个段子,涵盖了餐饮行业、淘品牌和创业企业的案例。通过这些案例,探讨了互联网思维的九大分类和十九条法则。其中包括雕爷牛腩餐厅的成功经验,三只松鼠淘品牌的包装策略以及一家创业企业的销售额增长情况。这些案例展示了互联网思维在不同领域的应用和成功之道。 ... [详细]
  • 概述H.323是由ITU制定的通信控制协议,用于在分组交换网中提供多媒体业务。呼叫控制是其中的重要组成部分,它可用来建立点到点的媒体会话和多点间媒体会议 ... [详细]
  • scrcpy通过adb调试的方式来将手机屏幕投到电脑上,并可以通过电脑控制您的Android设备。它可以通过USB连接,也可以通过Wifi连接(类似于隔空投屏),而且不需要任何ro ... [详细]
  • Imdevelopinganappwhichneedstogetmusicfilebystreamingforplayinglive.我正在开发一个应用程序,需要通过流 ... [详细]
author-avatar
潘多拉多宝_712
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有